#include "app.h"
#include "syn_tri.h"
#include "syn_data.h" //本模块是对此平台的适配器，依赖通用的应用逻辑
#include "sig_sim.h"

extern CMD_LIST bl_sys_cmd_list;
void app_ini(void)
{
//cmd初始化
	cmd_reg((CMD_LIST*)&bl_sys_cmd_list);


}
void app_poll(void) //100Hz 
{
}
void synd_send(S_SYN_10MS_PACK &d) //实现同步逻辑所需的发送函数
{
	uart_send((u8*)&d, sizeof(d), &uart1);
}
///////////////////////////////////////////////////////////
//				配置函数
//////////////////////////////////////////////////////////
//u8 cmd	:4; //0读1写2保存3回复		(rwsR)
//u8 type	:4; //类型：0:u8，1:u16，2:u32，3:操作失败	(bsi)
//u8 addr_h; //地址选择，选择单片机地址区域
//u16 addr; //地址
//u32 d; //数据
static const char *cmd_tab="rwsR";
static const char *type_tab="bsi";
void dbg_pro_out(COM_DBG *pd) //内存访问的处理和打印
{
	int r=pro_dbg((u8*)pd); //读写等操作
	if(r!=-1) //-1不需处理，0/1回复，2保存
	{
		s32 t0;
		if(pd->type==0) t0=(u8)(pd->d);
		else if(pd->type==1) t0=(u16)(pd->d);
		else t0=pd->d;
		printf("$@%c%c:%d:%d	%d\n",
			'R',type_tab[pd->type],pd->addr_h,pd->addr,t0);
	}
}
void fun_dbgma(s8 *para) //调试内存访问
{
	s32 t0=0,t1=0,t2,t3,t4;
	if(sscanf((const char*)para,"%c%c,%d,%d,%d",
		&t0,&t1,&t2,&t3,&t4)==5 || 
	sscanf((const char*)para,"%c%c,%d,0x%x,0x%d",
		&t0,&t1,&t2,&t3,&t4)==5)
	{
		COM_DBG d;
		int i;
		for(i=0;i<4;i++) if(cmd_tab[i]==t0) break;
		d.cmd=i;
		for(i=0;i<3;i++) if(type_tab[i]==t1) break;
		d.type=i;
		d.addr_h=t2; d.addr=t3; d.d=t4;
		dbg_pro_out(&d); //处理和打印
		if(d.cmd==1) //若是写，需要重新加载配置
		{
			cfg_2_var(); //配置加载
		}
	}
}
void fun_sim(char *para) //仿真pps和信号发送
{
	sig_sim_ini();
}

const CMD_STR can_str[]=
{
	"@",	"r,u8,cfg,addr,d",fun_dbgma, //调试内存访问
	"sim",	"simulate pps",fun_sim, //仿真pps和信号发送
};
CMD_LIST bl_sys_cmd_list={can_str,sizeof(can_str)/sizeof(CMD_STR),0};

